package createpattern.factory.abstractfactory;
/**
 * 抽象工厂模式
 * 角色：抽象工厂（Abstract Factory）：提供了创建产品的接口，它包含多个创建产品的方法，可以
 *        创建多个不同等级的产品。
 *      具体工厂（Concrete Factory）：主要是实现抽象工厂中的多个抽象方法，完成具体产品的创
 *        建。
 *      抽象产品（Product）：定义了产品的规范，描述了产品的主要特性和功能，抽象工厂模式有多
 *        个抽象产品。
 *      具体产品（ConcreteProduct）：实现了抽象产品角色所定义的接口，由具体工厂来创建，它
 *        同具体工厂之间是多对一的关系。
 * 拿铁咖啡和提拉米苏是同一产品族（也就是都属于意大利风味），美式咖啡和抹茶慕斯是同一产品族
 * （也就是都属于美式风味）。所以这个案例可以使用抽象工厂模式实现。
 * 如果要加同一个产品族的话，只需要再加一个对应的工厂类即可，不需要修改其他的类。
 *
 * 优点：
 * 当一个产品族中的多个对象被设计成一起工作时，它能保证客户端始终只使用同一个产品族中的对象。
 * 缺点：
 * 当产品族中需要增加一个新的产品时，所有的工厂类都需要进行修改。
 *
 * 使用场景
 * 当需要创建的对象是一系列相互关联或相互依赖的产品族时，如电器工厂中的电视机、洗衣机、空调等。
 * 系统中有多个产品族，但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。
 * 系统中提供了产品的类库，且所有产品的接口相同，客户端不依赖产品实例的创建细节和内部结构。
 * 如：输入法换皮肤，一整套一起换。生成不同操作系统的程序。
 *
 * */
public class Test {
    public static void main(String[] args) {

        DessertFactory dessertFactory = new AmericanDessertFactory();
        System.out.println(dessertFactory.createCoffee().getName());
        dessertFactory.createDessert().show();

        dessertFactory = new ItalyDessertFactory();
        System.out.println(dessertFactory.createCoffee().getName());
        dessertFactory.createDessert().show();

    }
}
